<!DOCTYPE html>
<html lang="zh-cn"><head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    
    <link href="/css/bootstrap.min.css" rel="stylesheet">
    <link href="/css/main.css" rel="stylesheet">

    <link rel="shortcut icon" type="image/x-icon" href="/img/favicon.ico" />

    <title>Go程序的函数 | wiseAI的小站</title>
</head><body><div class="container-fluid">
    <nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
        <div class="container-fluid">
            <a class="navbar-brand" href="/">
                <img src="/img/favicon.ico" alt="" width="30" height="24" class="d-inline-block align-text-top">
                wiseAI的小站
            </a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/articles/">文章</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/categories/">分类</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/tags/">关键字</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/post/golang/">golang编程</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/about/">关于</a>
                    </li>
                    
                </ul>
                <form class="d-flex">
                    <input id="search-query" class="form-control me-2" type="search" placeholder="Search for anything..." aria-label="Search">
                </form>
            </div>
        </div>
    </nav>
</div>




<div id="content">
<div class="container article">
	<h1>Go程序的函数</h1>
	<div class="post-meta">
		<div>
			
			
			By wiseai | 2022-07-14 | 1 minutes
		</div>
		<div class="tags">
			
			<a class="btn btn-light links btn-sm" href="/tags/%E7%BC%96%E7%A8%8B/">编程</a>
			
		</div>
	</div>
	<div>
		<div class="article-post">
			<h1 id="61-介绍">6.1 介绍</h1>
<p>每一个程序都包含很多的函数：函数是基本的代码块。</p>
<p>Go是编译型语言，所以函数编写的顺序是无关紧要的；鉴于可读性的需求，最好把 <code>main()</code> 函数写在文件的前面，其他函数按照一定逻辑顺序进行编写（例如函数被调用的顺序）。</p>
<p>编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务（那就是函数）来解决。而且，同一个任务（函数）可以被调用多次，有助于代码重用。</p>
<p>（事实上，好的程序是非常注意 DRY 原则的，即不要重复你自己 (Don&rsquo;t Repeat Yourself)，意思是执行特定任务的代码只能在程序里面出现一次。）</p>
<p>当函数执行到代码块最后一行（<code>}</code> 之前）或者 <code>return</code> 语句的时候会退出，其中 <code>return</code> 语句可以带有零个或多个参数；这些参数将作为返回值（参考 <a href="06.2.md">第 6.2 节</a>）供调用者使用。简单的 <code>return</code> 语句也可以用来结束 <code>for</code> 死循环，或者结束一个协程 (goroutine)。</p>
<p>Go 里面有三种类型的函数：</p>
<ul>
<li>普通的带有名字的函数</li>
<li>匿名函数或者lambda函数（参考 <a href="06.8.md">第 6.8 节</a>）</li>
<li>方法（Methods，参考 <a href="10.6.md">第 10.6 节</a>）</li>
</ul>
<p>除了 <code>main()</code>、<code>init()</code> 函数外，其它所有类型的函数都可以有参数与返回值。函数参数、返回值以及它们的类型被统称为函数签名。</p>
<p>作为提醒，提前介绍一个语法：</p>
<p>这样是不正确的 Go 代码：</p>
<pre tabindex="0"><code>func g()
{
}
</code></pre><p>它必须是这样的：</p>
<pre tabindex="0"><code>func g() {
}
</code></pre><p>函数被调用的基本格式如下：</p>
<pre tabindex="0"><code>pack1.Function(arg1, arg2, …, argn)
</code></pre><p><code>Function</code> 是 <code>pack1</code> 包里面的一个函数，括号里的是被调用函数的实参 (argument)：这些值被传递给被调用函数的<em>形参</em>（parameter，参考<a href="06.2.md">第 6.2 节</a>）。函数被调用的时候，这些实参将被复制（简单而言）然后传递给被调用函数。函数一般是在其他函数里面被调用的，这个其他函数被称为调用函数 (calling function)。函数能多次调用其他函数，这些被调用函数按顺序（简单而言）执行，理论上，函数调用其他函数的次数是无穷的（直到函数调用栈被耗尽）。</p>
<p>一个简单的函数调用其他函数的例子：</p>
<p>示例 6.1 <a href="examples/chapter_6/greeting.go">greeting.go</a></p>
<pre tabindex="0"><code>package main

func main() {
    println(&#34;In main before calling greeting&#34;)
    greeting()
    println(&#34;In main after calling greeting&#34;)
}

func greeting() {
    println(&#34;In greeting: Hi!!!!!&#34;)
}
</code></pre><p>代码输出：</p>
<pre><code>In main before calling greeting
In greeting: Hi!!!!!
In main after calling greeting
</code></pre>
<p>函数可以将其他函数调用作为它的参数，只要这个被调用函数的返回值个数、返回值类型和返回值的顺序与调用函数所需求的实参是一致的，例如：</p>
<p>假设 <code>f1</code> 需要 3 个参数 <code>f1(a, b, c int)</code>，同时 <code>f2</code> 返回 3 个参数 <code>f2(a, b int) (int, int, int)</code>，就可以这样调用 <code>f1</code>：<code>f1(f2(a, b))</code>。</p>
<p>函数重载 (function overloading) 指的是可以编写多个同名函数，只要它们拥有不同的形参/或者不同的返回值，在 Go 里面函数重载是不被允许的。这将导致一个编译错误：</p>
<pre><code>funcName redeclared in this book, previous declaration at lineno
</code></pre>
<p>Go 语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能；没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字，我们通常会根据函数的特征对函数进行命名（参考 <a href="11.12.md">第 11.12.5 节</a>）。</p>
<p>如果需要申明一个在外部定义的函数，你只需要给出函数名与函数签名，不需要给出函数体：</p>
<pre tabindex="0"><code>func flushICache(begin, end uintptr) // implemented externally
</code></pre><p><strong>函数也可以以申明的方式被使用，作为一个函数类型</strong>，就像：</p>
<pre tabindex="0"><code>type binOp func(int, int) int
</code></pre><p>在这里，不需要函数体 <code>{}</code>。</p>
<p>函数是一等值 (first-class value)：它们可以赋值给变量，就像 <code>add := binOp</code> 一样。</p>
<p>这个变量知道自己指向的函数的签名，所以给它赋一个具有不同签名的函数值是不可能的。</p>
<p>函数值 (functions value) 之间可以相互比较：如果它们引用的是相同的函数或者都是 <code>nil</code> 的话，则认为它们是相同的函数。函数不能在其它函数里面声明（不能嵌套），不过我们可以通过使用匿名函数（参考 <a href="06.8.md">第 6.8 节</a>）来破除这个限制。</p>
<p>目前 Go 没有泛型 (generic) 的概念，也就是说它不支持那种支持多种类型的函数。不过在大部分情况下可以通过接口 (interface)，特别是空接口与类型选择（type switch，参考 <a href="11.12.md">第 11.12 节</a>）与/或者通过使用反射（reflection，参考 <a href="06.8.md">第 6.8 节</a>）来实现相似的功能。使用这些技术将导致代码更为复杂、性能更为低下，所以在非常注意性能的的场合，最好是为每一个类型单独创建一个函数，而且代码可读性更强。</p>

		</div>
	</div>
</div>


<div class="container">
    
    <div class="row">
        
        <div class="col-5">
            <a class="page-link link-dark text-end dh" href="/post/golang/2022.07.13-%E6%A0%87%E7%AD%BE%E4%B8%8Egoto/">
                <h5>前一篇</h5><br>
                Go程序的标签与goto
            </a>            
        </div>
        
        <div class="col-2">
        </div>
        
        <div class="col-5">
            <a class="page-link link-dark text-start dh" href="/post/golang/2022.07.15-%E4%BD%BF%E7%94%A8%E9%97%AD%E5%8C%85%E8%B0%83%E8%AF%95/">
                <h5>后一篇</h5><br>
                Go程序使用闭包调试
            </a>            
        </div>
        
    </div>
    
</div>

        </div><br><br>
<footer class="container">
    <h2>友情链接</h2>
    <hr>
    <nav class="nav nav-pills flex-column flex-sm-row">
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/gnzg/index.html" target="_blank">孤鸟之歌</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/mm/index.html" target="_blank">生成随机字符</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/md/index.html" target="_blank">MarkDown</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/" target="_blank">Gitee</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://github.com/" target="_blank">Github</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyun.com/" target="_blank">阿里云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cloud.tencent.com/" target="_blank">腾讯云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.oschina.net/" target="_blank">OSCHINA开源中国</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/wiseai/the-way-to-go_ZH_CN/blob/master/eBook/directory.md" target="_blank">the way to go</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://topgoer.com/" target="_blank">golang文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://goframe.org/display/gf" target="_blank">GoFrame</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyundrive.com/" target="_blank">阿里云盘</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cn.vuejs.org/" target="_blank">vue3文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://element-plus.gitee.io/zh-CN/" target="_blank">element-plus文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.runoob.com/vue3/vue3-tutorial.html" target="_blank">vue3菜鸟教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://v5.bootcss.com/" target="_blank">bootstrap v5 中文文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.bootstrap.cn/" target="_blank">bootstrap文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://caddy2.dengxiaolong.com/docs/" target="_blank">caddy中文教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.58pic.com/" target="_blank">千图</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://ifonts.com/" target="_blank">iFonts</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://marketing.qiniu.com/" target="_blank">七牛云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.ixigua.com/" target="_blank">西瓜视频</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/yugang/index.html" target="_blank">鱼缸计算</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://justcc.mengkang.net/#/" target="_blank">C语言JustCC</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/pptist/" target="_blank">PPTist</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="/index.xml" target="_blank">RSS</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.kancloud.cn/idcpj/python/418553" target="_blank">参考资料</a>
        
    </nav>

    <div class="copyright text-center">
      <span class="power-by">
        Powered by <a class="links" href="https://gohugo.io" target="_blank">Hugo</a>
    </span>
    <span>|</span>
    <span>
        Theme - <a class="links" href="https://github.com/wiseai-go/blog-hugo" target="_blank">WiseAI</a>
    </span>
    <br>
    <span class="copyright-year">
        &copy;
        
        2017 -
        2023<span>
            陇ICP备15000157号
            
        </span></span>

</div>
</footer>
<script src="/js/bootstrap.bundle.min.js"></script>


</body>
</html>
